AVL树单旋转和双旋转算法(c)

要理解这段代码必须把单旋转和双旋转的算法搞明白。其次,要真正理解递归的用法。(注:在gcc环境下编译运行ok)

/*
 * avl tree.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;

struct AvlNode
{
	int Element;
	AvlTree Left;
	AvlTree Right;
	int Height;
};

int Max(int a, int b) 
{
	return (a >  b) ? a : b ;	
}

static int HeightAvl(Position P)
{
	if (P == NULL)
	{
		return -1;
	}
	else
	{
		return P->Height;
	}

}


static Position SingleRotateWithLeft(Position K2)
{
		Position K1;

		K1 = K2->Left;
		K2->Left = K1->Right;
		K1->Right = K2;

		K2->Height = Max(HeightAvl(K2->Left), HeightAvl(K2->Right)) +1;
		K1->Height = Max(HeightAvl(K1->Left), HeightAvl(K2->Right)) +1;

		return K1;
}

static Position SingleRotateWithRight(Position K2)
{
	Position K1;

	K1 = K2->Right;
	K2->Right = K1->Left;
	K1->Left = K2;

	K2->Height = Max(HeightAvl(K2->Left), HeightAvl(K2->Right)) +1;
	K1->Height = Max(HeightAvl(K1->Left), HeightAvl(K2->Right)) +1;

	return K1;
}

static Position DoubleRotateWithLeft(Position K3)
{
	K3->Left = SingleRotateWithRight(K3->Left);
	return SingleRotateWithLeft(K3);
}

static Position DoubleRotateWithRight(Position K3)
{
	K3->Left = SingleRotateWithLeft(K3->Left);
	return SingleRotateWithRight(K3);
}

AvlTree InsertAvl(int X, AvlTree T)
{
	if (T == NULL)
	{
		T = (AvlTree)malloc(sizeof(AvlTree));
		if (T == NULL)
		{
			printf("out of space!!!\n");
		}
		else
		{
			T->Left = NULL;
			T->Right = NULL;
		}
		T->Element = X;
		T->Height = 0;
	}
	else if (X < T->Element)
	{
		T->Left = InsertAvl(X, T->Left);
		 if (HeightAvl(T->Left) - HeightAvl(T->Right) == 2)
		 {
		 	if (X < T->Left->Element)
		 	{
				T = SingleRotateWithLeft(T);
			}
			else
			{
				T = DoubleRotateWithLeft(T);
			}
		 }
	}
	else if (X > T->Element)
	{
		T->Right = InsertAvl(X, T->Right);
		if (HeightAvl(T->Right) - HeightAvl(T->Left) == 2)
		{
			if (X > T->Right->Element)
			{
				T = SingleRotateWithRight(T);
			}
			else
			{
				T = DoubleRotateWithRight(T);
			}
		}
	}
	T->Height = Max(HeightAvl(T->Left), HeightAvl(T->Right)) + 1;
	return T;
}


int main(void)
{
	AvlTree Tree = NULL;
	InsertAvl(1, Tree);
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_807315755

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值